#ifndef BLUETOOTH_H
#define BLUETOOTH_H

#include "sys.h"
#include <stm32f4xx.h>

// 蓝牙数据包
#define BLUETOOTH_MAX 11      // 最大
#define BLUETOOTH_TAIL 0x03   // 尾部
#define BLUETOOTH_HEADER 0x02 // 头部
#define BLUETOOTH_LENGTH 0x09 // 长度

// BLUETOOTH引脚
#define BLUETOOTH_TX GPIO_Pin_8 // TX
#define BLUETOOTH_RX GPIO_Pin_9 // RX

// USART引脚
#define BLUETOOTH_USART_TX GPIO_PinSource8 // TX
#define BLUETOOTH_USART_RX GPIO_PinSource9 // RX

// GPIO
#define BLUETOOTH_GPIO GPIOD                                                                  // GPIOD组
#define BLUETOOTH_GPIO_Pin (BLUETOOTH_TX | BLUETOOTH_RX)                                      // 蓝牙引脚
#define BLUETOOTH_RCC_APBPeriphClockCmd RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE) // APB时钟
#define BLUETOOTH_RCC_AHBPeriphClockCmd RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE)  // AHB时钟

// USART
#define BLUETOOTH_USART USART3                 // USART3组
#define BLUETOOTH_USART_BaudRate 9600          // USART波特
#define BLUETOOTH_GPIO_AF_USART GPIO_AF_USART3 // 复用USART

// NVIC
#define BLUETOOTH_USART_IRQn USART3_IRQn              // USART中断
#define BLUETOOTH_NVIC_IRQChannelSubPriority 2        // 响应优先级
#define BLUETOOTH_NVIC_IRQChannelPreemptionPriority 3 // 抢占优先级
#define BLUETOOTH_USART_IRQHandler USART3_IRQHandler  // 中断处理器

/**
 * @name 蓝牙消息
 * @struct
 */
#pragma pack(1)
typedef struct tagBLUETOOTH_MSG {
    uint8_t type; // 消息类型
    uint32_t msg; // 消息内容
} BLUETOOTH_MSG, *PBLUETOOTH_MSG;
#pragma pack()

/**
 * @name bluetooth初始化
 * @description
 * @function
 * @returns {void}
 * @requires []
 */
void bluetooth_init(void);

/**
 * @name 接收消息
 * @description
 * @function
 * @returns {BLUETOOTH_MSG} 消息
 * @requires []
 */
BLUETOOTH_MSG bluetooth_recv(void);

/***
 * @name 发送消息
 * @description
 * @function
 * @param {BLUETOOTH_MSG} msg 消息
 * @returns {void}
 * @requires [msg]
 */
void bluetooth_send(const BLUETOOTH_MSG msg);
#endif
